import socket  # 导入 socket 模块
from threading import Thread
import time
import json
import pika
from queue import Queue


#基本FIFO队列  先进先出 FIFO即First in First Out,先进先出
FIFO = Queue(maxsize=0) #maxsize设置队列中，数据上限，小于或等于0则不限制，容器中大于这个数则阻塞，直到队列中的数据被消掉
FIFO_sand = Queue(maxsize=0) #maxsize设置队列中，数据上限，小于或等于0则不限制，容器中大于这个数则阻塞，直到队列中的数据被消掉



class C_queueServer:
    queueu_sand_obj = None
    queueu_rev_obj = None
    def queue_init_sand(self):
        #建立连接
        userx=pika.PlainCredentials("ruroot","rproot")
        conn=pika.BlockingConnection(pika.ConnectionParameters("0.0.0.0",5672,'/',credentials=userx))
        #开辟管道
        self.queueu_sand_obj=conn.channel()
        #声明队列，参数为队列名
        self.queueu_sand_obj.queue_declare(queue="client")

    def queue_init_rev(self):
        #建立连接
        userx=pika.PlainCredentials("ruroot","rproot")
        conn=pika.BlockingConnection(pika.ConnectionParameters("0.0.0.0",5672,'/',credentials=userx))
        #开辟管道
        self.queueu_rev_obj=conn.channel()
        #声明队列，参数为队列名
        self.queueu_rev_obj.queue_declare(queue="queue_rev")

    def queue_rev(self, func, data):
        #接收准备
        self.queueu_rev_obj.basic_consume(queue="queue_rev", #队列名
                            on_message_callback = func, #收到消息的回调函数 
                            auto_ack=True #是否发送消息确认
                            )
        print("C_queueServer:接收初始化")
        #开始接收消息
        self.queueu_rev_obj.start_consuming()



    def queue_rev_Run(self, func):
        thread_queue = Thread(target = self.queue_rev, args = (func, 0)) # 设备发送数据给django 
        # 设置成守护线程
        thread_queue.setDaemon(True)
        thread_queue.start()

    def queue_sand(self, datastr = "no data"):
        #发送数据，发送一条，如果要发送多条则复制此段
        self.queueu_sand_obj.basic_publish(exchange="",
                            routing_key="queueu_sand",# 队列名
                            body="hello world" # 发送的数据
                            )
        print("C_queueServer:数据发送完成", datastr)    

#消息处理函数，执行完成才说明接收完成，此时才可以接收下一条，串行
def dongcallbackfun(v1,v2,v3,bodyx):
    print("C_queueServer:回调函数 接收到了数据",bodyx)
    FIFO.put(bodyx)
    print(FIFO.qsize(), FIFO.queue)

if __name__ == '__main__':
    aClass = C_queueServer()
    aClass.queue_init_rev()
    aClass.queue_rev_Run(dongcallbackfun)

    aclass_sand = C_queueServer()
    aclass_sand.queue_init_sand()

    while(1):
        time.sleep(1)
        aclass_sand.queue_sand()